home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekikoh Dennoh Club 2
/
Gekikoh Dennoh Club Vol. 2 (Japan).7z
/
Gekikoh Dennoh Club Vol. 2 (Japan) (Track 01).bin
/
tools
/
post2_g2
/
src
/
p_find.c
< prev
next >
Wrap
Text File
|
1997-10-13
|
13KB
|
578 lines
/*
post / 郵便番号検索プログラム
p_find.c / 検索部
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "post.h"
/*
市区郡存在チェック&抜き出し
*/
void
shikugun_check()
{
int goukei = 0, /* 市区郡文字数合計 */
shiku_num[ 5 ], /* 入力住所内に市区郡の文字が何文字ずつあるか */
i1=0, i2=0; /* ループ汎用 */
/*
各デリミタ漢字数算出
*/
for( i1=0; i1<=5-1; ++i1 ) {
shiku_num[ i1 ] = strschks( input_str, kanji_shiku[ i1 ] );
goukei += shiku_num[ i1 ];
}
/*
市区郡特定
*/
switch (goukei) {
case 0:
/* 独自検索を試みる */
dokuji_kensaku();
break;
case 1:
if( shiku_num[ 2 ] ) { /* つまり、「郡」のみ見つかった */
// 未決。郡のみを検索する。→特Aへ
printf("警告 101 : 郡の入力はありましたが、");
printf("町村の特定ができませんでした。\n");
return;
} else {
/* 何にヒットしたのか? */
for( i1=0; i1<=5-1; ++i1 ) {
if( shiku_num[ i1 ] ) {
i2 = i1;
break;
}
}
cut_check( i2, -1 );
}
break;
case 2:
if( shiku_num[ 2 ] && shiku_num[ 3 ] ) { /* 郡と町 */
cut_check( 2, 3 );
} else if( shiku_num[ 2 ] && shiku_num[ 4 ] ) { /* 郡と村 */
cut_check( 2, 4 );
} else if( shiku_num[ 0 ] && shiku_num[ 1 ] ) { /* 市と区 */
if( (todo_sw) && (num_pref == 12) ) {
cut_check( 1, -1 ); /* 東京に市内区はない */
} else {
cut_check( 0, 1 ); /* 市内区だ */
}
} else {
/* 複数可能性を同時チェック */
check_kanousei( shiku_num );
}
break;
default: /* デリミタが3つ以上検索できた */
/* 複数可能性を同時チェック */
check_kanousei( shiku_num );
break;
} /* switch終端 */
return;
}
/*
市区郡町村を切り離し&特定
特定できた場合、shiku_tokutei_sw をオン
*/
void
cut_check( int kou1, int kou2 )
{
int i1, /* ループ汎用 */
shima = 0, /* 島しょ特定用 */
delim_code, /* デリミタコード(kou2市内区処理用) */
toku_sw = 0, /* 都区かどうか */
kensuu = 0, /* 件数カウント */
point[32], /* ポイント検索時の ofs 退避 */
next = 0, /* 次のオフセットを取るため */
s_num = 0, /* 選択肢用 */
ofs_taihi; /* オフセット待避用 */
uchar cc_work[64], /* キャラクタチェック・ワーク */
*cc_work_p, /* cc_work用のポインタ */
cc_work2[64], /* del_last_char 対策 */
tbuf[64], /* 県/郡確定用ワーク */
pr_wk[64], /* 区選択用ワーク */
*tbuf_p; /* tbuf用ポインタ */
uchar numbuff[12];
uchar ku_kubun[12], /* 特別区かどうか */
/* 市内区のみ入力時のプール */
todouf_p[12][10], /* 都道府県用 */
shigun_p[12][64], /* 市名・郡名用 */
kutyou_p[12][64], /* 区名・町村名用 */
/* 読みも */
todouf_y[12][10], /* 都道府県用 */
shigun_y[12][64], /* 市名・郡名用 */
kutyou_y[12][64]; /* 区名・町村名用 */
cc_work[0] = '\0'; /* 配列初期化 */
cc_work_p = cc_work; /* ポインタ初期化 */
koumoku_set( cc_work_p, kou1 ); /* 項目の特定 */
// printf("cc_work=|%s|,kou1=%d\n",cc_work,kou1);
if( kou1 == 1 ) { /* 「区」なら、特別区か市内区かを判定する */
/* 特別区かどうかを調べる */
toku_sw = 0;
for( i1=0; i1<=kusuu-1; i1++ ) {
if( strcmp( cc_work, toku[i1][0] ) == 0 ) {
toku_sw = 1;
break;
}
}
/* デリミタなしで区名を検索、件数をカウント */
ofs_taihi = ofs;
ofs = 0;
kensuu = 0;
strcpy( cc_work2, cc_work );
del_last_char( cc_work2 );
do {
ofs = bm_find( '.', cc_work2, ofs );
if( ofs == -1 ) {
break;
}
/* 次がデリミタでない=揃わなかった */
if( buf[ofs+1] != '+' ) {
ofs++;
continue; /* ヒットではない */
}
next = ofs; /* 今のオフセットをとっておく */
pass_back_han( '.' ); /* 直前のデリミタまで戻る */
if( buf[ ofs-1 ] == '$' || buf[ ofs-1] == '\"' ) { /* 区なら */
/* 記憶しておく */
point[ kensuu ] = ofs - 1; /* デリミタを指している */
kensuu++;
}
ofs = next; /* オフセットを戻す */
} while( 1 );
ofs = ofs_taihi;
if( kensuu == 0 ) { /* 該当区名は特別区・市内区にはなかった */
printf("警告 105 : 区名は検索できませんでした。|%s|\n", cc_work );
} else if( kensuu == 1 ) { /* 1件に絞れた */
if( !toku_sw ) { /* 特別区ではない */
ofs = point[0] + 1;
next = ofs - 1;
/* 区名をゲット */
get_next_han( shikumei2 );
strcat( shikumei2, "区" );
get_next_han2( yomi2 );
/* 直前の市名をゲット */
pass_back_han( '!' );
get_next_han( shikumei );
strcat( shikumei, "市" );
get_next_han2( yomi1 );
kou1 = 1; /* 市 */
kou2 = 5; /* 市内区 */
shiku_tokutei_sw = 1; /* これで確定 */
str_purge( cc_work ); /* 入力文字列から削除 */
todo_kakutei(); /* 都道府県を確定 */
ofs = next;
pass_next_han2( '*' );
return;
} else {
kou1 = 1;
kou2 = -1;
}
} else { /* 2件以上あった */
for( i1=0; i1<=kensuu-1; i1++ ) {
ofs = point[i1]; /* デリミタを指している */
if( buf[ofs] == '\"' ) { /* 特別区 */
ofs++;
ku_kubun[i1] = 1;
get_next_han( shigun_p[i1] ); /* 市郡の方に取る */
strcat( shigun_p[i1], "区" );
get_next_han2( shigun_y[i1] );
strcpy( todouf_p[i1], "東京都" );
strcpy( todouf_y[i1], "トウキョウト" );
kutyou_p[i1][0] = '\0';
kutyou_y[i1][0] = '\0';
} else { /* 市内区 */
ofs++;
ku_kubun[i1] = 0;
/* 区名をゲット */
get_next_han( kutyou_p[i1] );
strcat( kutyou_p[i1], "区" );
get_next_han2( kutyou_y[i1] );
/* 直前の市名をゲット */
pass_back_han( '!' );
get_next_han( shigun_p[i1] );
strcat( shigun_p[i1], "市" );
get_next_han2( shigun_y[i1] );
/* 都道府県名をゲット */
pass_back_han( ' ' );
get_next_han( todouf_p[i1] );
get_next_han2( todouf_y[i1] );
}
}
/* 列挙して表示 */
puts("解析の結果、次のような候補を検索することができました。");
puts("希望する正しい住所を選択して下さい。");
strcpy( pr_wk, cc_work );
del_last_char( pr_wk );
for( i1=0; i1<=kensuu-1; i1++ ) {
/* 桁揃え */
keta( todouf_y[i1], todouf_p[i1] );
keta( shigun_y[i1], shigun_p[i1] );
keta( kutyou_y[i1], kutyou_p[i1] );
printf("%2d :\t", i1+1 );
kugiri();
printf("%s", todouf_y[i1] );
kugiri();
printf("%s", shigun_y[i1] );
kugiri();
if( ku_kubun[i1] == 0 ) {
printf("%s", kutyou_y[i1] );
kugiri();
}
puts("");
printf("\t");
kugiri();
printf("%s", todouf_p[i1] );
kugiri();
if( ku_kubun[i1] == 0 ) {
printf("%s", shigun_p[i1] );
kugiri();
moji_pr( kutyou_p[i1], pr_wk ); /* 色付き表示 */
kugiri();
} else {
moji_pr( shigun_p[i1], pr_wk );
kugiri();
}
puts("");
}
printf("1 から %2d までの数字で選択して下さい : ",kensuu);
do{
scanf( "%2s", numbuff );
s_num = atoi( numbuff );
} while ( (s_num < 1) || (s_num > kensuu) );
puts("");
/* 入力される番号は、表示を1から始めるため、実際には1多い */
s_num--;
if( ku_kubun[ s_num ] == 0 ) { /* 市内区なら */
strcpy( shikumei2, kutyou_p[ s_num ] ); /* 区名をセット */
strcpy( yomi2, kutyou_y[ s_num ] ); /* 区名読み */
strcpy( shikumei, shigun_p[ s_num ] ); /* 市名をセット */
strcpy( yomi1, shigun_y[ s_num ] ); /* 市名読み */
kou1 = 1; /* 市 */
kou2 = 5; /* 市内区 */
shiku_tokutei_sw = 1; /* これで確定 */
str_purge( cc_work ); /* 入力文字列から削除 */
ofs = point[ s_num ];
todo_kakutei(); /* 都道府県を確定 */
pass_next_han2( '*' );
return;
} else { /* 特別区なら */
/* cut_check でちゃんと処理される */
kou1 = 1;
kou2 = -1;
}
}
}
if( find_strs_pref( cc_work, kou1 ) ) {
if( todo_sw == 0 ) { /* 都道府県が確定していなければ確定する */
todo_kakutei(); /* 確定ルーチンへ */
}
if( (kou1 == 3) || (kou1 == 4) ) { /* 郡が確定していなければ確定する */
if( num_pref == 12 ) { /* 東京都なら */
/* 島名を特定 */
shima = -1;
for( i1=0; i1<=tousuu-1; i1++ ) {
if( strstr( cc_work, tousyo[i1][0] ) != NULL ) {
shima = i1;
break;
}
}
if( shima != -1 ) {
tousyo_sw = 1;
} else {
tousyo_sw = 0;
}
}
ofs_taihi = ofs;
tbuf[ 0 ] = '\0';
tbuf_p = tbuf;
pass_back_han( delim_shiku[ 2 ] ); /* [2]は郡 */
get_next_han( tbuf_p ); /* 郡名を得る */
/* 郡名の読みはあとで得る(島しょ対策) */
kou2 = kou1; /* kou2は町村へ */
kou1 = 1; /* kou1は郡へ */
if( tousyo_sw ) { /* 島しょの場合 */
strcpy( shikumei, "島しょ" ); /* 郡名はなし */
strcpy( yomi1, "トウシヨ" );
} else {
fuka_delim( tbuf_p, 2 ); /* 「郡」の字を追加 */
strcpy( shikumei, tbuf );
get_next_han2( yomi1 ); /* 郡の読みを得る */
}
/* いまofsは町名の直後にいるので補正 */
ofs = ofs_taihi - (strlen( tbuf ) + 1);
get_next_han2( yomi2 ); /* 町村名の読みを得る */
} else {
strcpy( shikumei, cc_work ); /* 市区名ワークへコピー */
str_purge( cc_work ); /* 入力文字列から市区名を削除 */
get_next_han2( yomi1 ); /* 市区名の読みを得る */
}
/* 郡+町村または市+市内区の処理 */
if( kou2 != -1 ) {
cc_work[0] = '\0'; /* 配列初期化 */
cc_work_p = cc_work; /* ポインタ初期化 */
koumoku_set( cc_work_p, kou2 ); /* 項目の特定 */
if( kou2 == 1 ) { /* 市内区なら */
delim_code = 5; /* 市内区デリミタコードをセット */
} else {
delim_code = kou2; /* たぶん郡だが */
}
if( find_strs_kou2( cc_work, delim_code ) ) { /* 市内区か町村 */
strcpy( shikumei2, cc_work ); /* 市区名ワーク2へコピー */
str_purge( cc_work ); /* 入力文字列から市区名2を削除 */
get_next_han2( yomi2 ); /* 読みを得る */
if( tousyo_sw ) { /* 島しょなら */
strcpy( shikumei, "" ); /* 郡名なしで */
strcpy( yomi1, "" ); /* 読みもなし */
} /* なんか五七五だな */
} else { /* 市・郡はうまくいったが区・町村でこけた */
printf("delim_code=|%d|, delim=|%c|\n",delim_code, delim_shiku[delim_code] );
// shima = -1;
// for( i1=0; i1<=tousuu-1; i1++ ) {
// if( strstr( cc_work, tousyo[i1][0] ) != NULL ) {
// shima = i1;
// break;
// }
// }
// if( shima != -1 ) { /* 島しょなら */
//@@
// 未決。市区町村を選ばせる
printf("警告 102 : 市内区または");
printf("町村の検索に失敗しました。 : |%s|\n",cc_work);
return;
}
} else {
if( (kou1 == 0) && (check_next_delim(1) ) ) {
// 未決。市内区を選ばせる
printf("警告 103 : たぶん市内区の入力が抜けています。\n");
return;
}
shikumei2[ 0 ] = '\0'; /* 市区名2はない */
} /* kou2判定if終端 */
shiku_tokutei_sw = 1;
} else {
/* ここに来るのは、入力間違いなど */
if( !dokuji_sw ) { /* 独自検索でなければ */
dokuji_kensaku(); /* 独自検索してみる */
} else {
printf("警告 104 : 市町村が検索できませんでした。");
printf(": |%d|%s|\n",kou1,cc_work);
return;
}
} /* find_strs_prefのif終端 */
return;
}
/*
post.datの中から引数cc_workを検索する 市区郡用
引数 cwork : 探す文字列(市区郡名)
delim_code : 探す文字列デリミタ
戻り値 (int) : 合致すれば1 しなければ0
*/
int
find_strs_pref( uchar *cwork, int delim_code )
{
uchar read_str[256]; /* 読み出し文字列ワーク */
read_str[ 0 ] = '\0';
ken_atamadashi();
ofs = pref_ofs;
strcpy( read_str, cwork ); /* ワークにコピー */
del_last_char( read_str ); /* 最終文字(=市とか区とか)を削除 */
while( 1 ) {
ofs = bm_find( delim_shiku[delim_code], read_str, ofs );
/* 終端か、 きっちり揃ったか */
if( (ofs == -1) || (check_next_delim(0)) ) {
break;
}
}
return (ofs == -1) ? 0 : 1;
}
/*
post.datの中から引数cworkを検索する 市内区・町村用
引数 cwork : 探す文字列(市区郡名)
delim_code : 探す文字列デリミタ
戻り値 (int) : 合致すれば1 しなければ0
*/
int
find_strs_kou2( uchar *cwork, int delim_code )
{
int ret_val = 0; /* 戻り値用 */
uchar read_wk, /* 読み出しワーク */
read_str[256], /* 読み出し文字列ワーク */
*read_str_p; /* 読み出し文字列ポインタ */
/* オフセットを戻す */
ofs -= ( strlen(shikumei)+1 );
while( 1 ) {
read_wk = buf[ ofs++ ]; /* 一文字取得 */
if( is_not_delim( read_wk ) ) {
continue; /* デリミタ文字列でない */
}
if( read_wk == delim_shiku[ delim_code ] ) { /* デリミタ一致 */
read_str[ 0 ] = '\0'; /* 初期化 */
read_str_p = read_str; /* ポインタセット */
*read_str_p++ = buf[ ofs++ ]; /* 漢字の前半分を取得 */
if( read_str[ 0 ] != cwork[ 0 ] ) { /* 前半分比較 */
continue;
}
*read_str_p++ = buf[ ofs++ ]; /* 漢字の後半分を取得 */
if( read_str[ 1 ] == cwork[ 1 ] ) { /* 後半分比較 */
get_next_han( read_str_p ); /* 次の半角文字までを得る */
/* トークンに合わせて「市区町村」を付加 */
fuka_delim( read_str_p, delim_code );
if( strcmp( cwork, read_str ) == 0 ) { /* 合うか? */
ret_val = 1;
break;
}
} else {
continue;
}
} else if( (read_wk == '#') || (read_wk == '!') ) { /* 市か郡である */
break; /* 終わり */
} /* デリミタ判定終端 */
} /* while終端 */
return ret_val;
}